package com.example.demo810.biz;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

/**
 * @author lzh
 * @date 2020/8/11 - 11:39
 */
@Service
public class TestService {
    //而@Secured对应的角色必须要有ROLE_前缀
    //@Secured的值必须加前缀ROLE_
    //@Secured注释是用来定义业务方法的安全性配置属性列表。
    // 您可以使用@Secured在方法上指定安全性要求[角色/权限等]，
    // 只有对应角色/权限的用户才可以调用这些方法。
    // 如果有人试图调用一个方法，但是不拥有所需的角色/权限，那会将会拒绝访问将引发异常
    @Secured("ROLE_USER")
    public String testUser() {
        return "hello user，访问此方法需要USER角色";
    }

    @Secured("ROLE_ADMIN") //访问此方法需要ADMIN角色
    public String testAdmin() {
        return "hello admin，访问此方法需要ADMIN角色";
    }

    //@PreAuthorize/@PostAuthorize 注解是首选应用到方法级安全性的方式，
    // 并支持Spring表达式语言，也提供基于表达式的访问控制


    //@PreAuthorize适合进入方法之前验证授权。
    // @PreAuthorize可以兼顾，角色/登录用户权限，参数传递给方法等等
    @PreAuthorize("hasRole('ADMIN') and hasRole('TEST')")  //访问此方法需要ADMIN且DBA
    public String testAnd() {
        return "AND权限测试,hasRole('ADMIN') and hasRole('TEST'),2个角色都满足，才执行service方法";
    }


    @PreAuthorize("hasAnyRole('ADMIN','TEST','USER')")    //三个都行
    public String testAny() {
        return "hasAnyRole注解测试,hasAnyRole('ADMIN','TEST','USER')任意一个角色都可执行service方法";
    }

    //@PostAuthorize 虽然不经常使用，检查授权方法之后才被执行，所以它适合用在对返回的值作验证授权。
    // Spring EL提供可在表达式语言来访问并从方法返回 returnObject 对象来反映实际的对象




}
